/*
 * Copyright (c) 2018 Tencent. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
const AbstractModel = require("../../common/abstract_model");

/**
 * CreateIncrementalMigrationStrategy response structure.
 * @class
 */
class CreateIncrementalMigrationStrategyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The ID of the incremental migration strategy.
         * @type {string || null}
         */
        this.StrategyId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.StrategyId = 'StrategyId' in params ? params.StrategyId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Incremental migration strategy information.
 * @class
 */
class IncrementalMigrationStrategyInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * The ID of the incremental migration strategy.
         * @type {string || null}
         */
        this.StrategyId = null;

        /**
         * The name of the incremental migration strategy.
         * @type {string || null}
         */
        this.StrategyName = null;

        /**
         * <b>The ID of [VOD Professional Application](http://tencentcloud.com/document/product/266/67977).</b>
         * @type {number || null}
         */
        this.SubAppId = null;

        /**
         * The bucket ID where the strategy takes effect.
         * @type {string || null}
         */
        this.BucketId = null;

        /**
         * Source type.
         * @type {string || null}
         */
        this.OriginType = null;

        /**
         * Incremental migration HTTP origin source configuration.
         * @type {IncrementalMigrationHttpOriginConfig || null}
         */
        this.HttpOriginConfig = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.StrategyId = 'StrategyId' in params ? params.StrategyId : null;
        this.StrategyName = 'StrategyName' in params ? params.StrategyName : null;
        this.SubAppId = 'SubAppId' in params ? params.SubAppId : null;
        this.BucketId = 'BucketId' in params ? params.BucketId : null;
        this.OriginType = 'OriginType' in params ? params.OriginType : null;

        if (params.HttpOriginConfig) {
            let obj = new IncrementalMigrationHttpOriginConfig();
            obj.deserialize(params.HttpOriginConfig)
            this.HttpOriginConfig = obj;
        }

    }
}

/**
 * DeleteIncrementalMigrationStrategy request structure.
 * @class
 */
class DeleteIncrementalMigrationStrategyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * <b>The ID of [VOD Professional Application](http://tencentcloud.com/document/product/266/67977).</b>
         * @type {number || null}
         */
        this.SubAppId = null;

        /**
         * The bucket ID where the strategy takes effect.
         * @type {string || null}
         */
        this.BucketId = null;

        /**
         * The ID of the incremental migration strategy.
         * @type {string || null}
         */
        this.StrategyId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubAppId = 'SubAppId' in params ? params.SubAppId : null;
        this.BucketId = 'BucketId' in params ? params.BucketId : null;
        this.StrategyId = 'StrategyId' in params ? params.StrategyId : null;

    }
}

/**
 * Incremental migration source information.
 * @class
 */
class IncrementalMigrationHttpOriginInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Incremental migration source address information.
         * @type {IncrementalMigrationHttpEndpointInfo || null}
         */
        this.EndpointInfo = null;

        /**
         * Incremental migration source file information.
         * @type {IncrementalMigrationOriginFileInfo || null}
         */
        this.FileInfo = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.EndpointInfo) {
            let obj = new IncrementalMigrationHttpEndpointInfo();
            obj.deserialize(params.EndpointInfo)
            this.EndpointInfo = obj;
        }

        if (params.FileInfo) {
            let obj = new IncrementalMigrationOriginFileInfo();
            obj.deserialize(params.FileInfo)
            this.FileInfo = obj;
        }

    }
}

/**
 * CreateStorageCredentials request structure.
 * @class
 */
class CreateStorageCredentialsRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * <b>The ID of [VOD Professional Application](http://tencentcloud.com/document/product/266/67977).</b>
         * @type {number || null}
         */
        this.SubAppId = null;

        /**
         * The policy string serialized by URL Encode is used as the input parameter Policy. The server will URL Decode the Policy value and grant temporary access credentials according to the parsed policy. Please pass in parameters according to the specification.
Note:
1.The policy syntax refers to [Cloud Access Management](/document/product/598/10603).
2.The policy cannot contain the principal element.
3.The policy actions include: 
<li>name/vod:ListObjects;</li>
<li>name/vod:ListObjectsV2;</li>
<li>name/vod:HeadObject;</li>
<li>name/vod:PutObject;</li>
<li>name/vod:ListParts;</li>
<li>name/vod:PostObject;</li>
<li>name/vod:CreateMultipartUpload;</li>
<li>name/vod:UploadPart;</li>
<li>name/vod:CompleteMultipartUpload;</li>
<li>name/vod:AbortMultipartUpload;</li>
<li>name/vod:ListMultipartUploads;</li>
<li>name/vod:CopyObject;</li>
<li>name/vod:RestoreObject;</li>
<li>name/vod:DeleteObjects;</li>
<li>name/vod:DeleteObject;</li>
<li>name/vod:UploadPartCopy.</li>4.The resource format of the policy is `qcs::vod:[region]:uid/[AppID]:prefix//[SubAppId]/[BucketId]/[Path]`, where AppID, SubAppId, BucketId and Path need to be filled in as required.

         * @type {string || null}
         */
        this.Policy = null;

        /**
         * Specifies the validity period of credentials in seconds. The default value is 1800 seconds and the maximum value is 129600 seconds.
         * @type {number || null}
         */
        this.DurationSeconds = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubAppId = 'SubAppId' in params ? params.SubAppId : null;
        this.Policy = 'Policy' in params ? params.Policy : null;
        this.DurationSeconds = 'DurationSeconds' in params ? params.DurationSeconds : null;

    }
}

/**
 * Incremental migration source address information.
 * @class
 */
class IncrementalMigrationHttpEndpointInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Address information, supporting domain names or IP addresses.
         * @type {string || null}
         */
        this.Endpoint = null;

        /**
         * Backup address information.
         * @type {Array.<string> || null}
         */
        this.StandbyEndpointSet = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Endpoint = 'Endpoint' in params ? params.Endpoint : null;
        this.StandbyEndpointSet = 'StandbyEndpointSet' in params ? params.StandbyEndpointSet : null;

    }
}

/**
 * Incremental migration of origin address prefix configuration.
 * @class
 */
class IncrementalMigrationOriginPrefixConfig extends  AbstractModel {
    constructor(){
        super();

        /**
         * Origin address prefix: If you fill in `test/`, the origin-pull address will be `http(s)://<origin domain>/test/<file name>`.
         * @type {string || null}
         */
        this.Prefix = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Prefix = 'Prefix' in params ? params.Prefix : null;

    }
}

/**
 * DescribeIncrementalMigrationStrategyInfos response structure.
 * @class
 */
class DescribeIncrementalMigrationStrategyInfosResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Total count of matched strategies.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Information of all matched strategies.
         * @type {Array.<IncrementalMigrationStrategyInfo> || null}
         */
        this.StrategyInfoSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.StrategyInfoSet) {
            this.StrategyInfoSet = new Array();
            for (let z in params.StrategyInfoSet) {
                let obj = new IncrementalMigrationStrategyInfo();
                obj.deserialize(params.StrategyInfoSet[z]);
                this.StrategyInfoSet.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Incremental migration back-to-origin HTTP Header.
 * @class
 */
class IncrementalMigrationHttpHeader extends  AbstractModel {
    constructor(){
        super();

        /**
         * Header Key.
         * @type {string || null}
         */
        this.Key = null;

        /**
         * Header Value.
         * @type {string || null}
         */
        this.Value = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Key = 'Key' in params ? params.Key : null;
        this.Value = 'Value' in params ? params.Value : null;

    }
}

/**
 * Storage information for the professional application.
 * @class
 */
class StorageInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * The ID of bucket.
         * @type {string || null}
         */
        this.BucketId = null;

        /**
         * The name of bucket.
         * @type {string || null}
         */
        this.StorageName = null;

        /**
         * The region of storage.
         * @type {string || null}
         */
        this.StorageRegion = null;

        /**
         * The status of the internet access domain name is stored. Valid values: <li>ONLINE: Active;</li> <li>DEPLOYING: In deployment.</li>
         * @type {string || null}
         */
        this.InternetAccessDomainStatus = null;

        /**
         * The internet access domain name of storage.
         * @type {string || null}
         */
        this.InternetAccessDomain = null;

        /**
         * The creation time of the storage.
         * @type {string || null}
         */
        this.CreateTime = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.BucketId = 'BucketId' in params ? params.BucketId : null;
        this.StorageName = 'StorageName' in params ? params.StorageName : null;
        this.StorageRegion = 'StorageRegion' in params ? params.StorageRegion : null;
        this.InternetAccessDomainStatus = 'InternetAccessDomainStatus' in params ? params.InternetAccessDomainStatus : null;
        this.InternetAccessDomain = 'InternetAccessDomain' in params ? params.InternetAccessDomain : null;
        this.CreateTime = 'CreateTime' in params ? params.CreateTime : null;

    }
}

/**
 * DescribeStorage request structure.
 * @class
 */
class DescribeStorageRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * <b>The ID of [VOD Professional Application](http://tencentcloud.com/document/product/266/67977).</b>
         * @type {number || null}
         */
        this.SubAppId = null;

        /**
         * Filter criteria. The maximum number of Filters.Values is `20`. If this parameter is not input, all storage under the current SubAppId will be returned. The detailed filter criteria are as follows:
<li>BucketId: Filter by the ID of bucket;</li>
<li>StorageName: Filter by the name of storage.</li>
         * @type {Array.<Filter> || null}
         */
        this.Filters = null;

        /**
         * Sort the returned results according to this field. 
SortBy.Field Values include: 
<li>UpdateTime: (Default) Create time of the storage.</li>SortBy.Order Values include: 
<li>Asc: (Default) The order is ascend.</li> 

         * @type {SortBy || null}
         */
        this.SortBy = null;

        /**
         * Offset for paginated queries. Default value: `0`.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Limit on paginated queries. Default value: `20`. Maximum value: `1000`.
         * @type {number || null}
         */
        this.Limit = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubAppId = 'SubAppId' in params ? params.SubAppId : null;

        if (params.Filters) {
            this.Filters = new Array();
            for (let z in params.Filters) {
                let obj = new Filter();
                obj.deserialize(params.Filters[z]);
                this.Filters.push(obj);
            }
        }

        if (params.SortBy) {
            let obj = new SortBy();
            obj.deserialize(params.SortBy)
            this.SortBy = obj;
        }
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;

    }
}

/**
 * DescribeIncrementalMigrationStrategyInfos request structure.
 * @class
 */
class DescribeIncrementalMigrationStrategyInfosRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * <b>The ID of [VOD Professional Application](http://tencentcloud.com/document/product/266/67977).</b>
         * @type {number || null}
         */
        this.SubAppId = null;

        /**
         * Filter criteria. The maximum number of Filters.Values is `20`. If this parameter is not input, all stategy information under the current SubAppId will be returned. The detailed filter criteria are as follows:
<li>BucketId: Filter by the ID of bucket;</li>
<li>StrategyId: Filter by the ID of strategy.</li>
         * @type {Array.<Filter> || null}
         */
        this.Filters = null;

        /**
         * Sort the returned results according to this field. 
SortBy.Field Values include: 
<li>UpdateTime: (Default) Update time of the strategy.</li>SortBy.Order Values include: 
<li>Desc: (Default) The order is descend.</li> 

         * @type {SortBy || null}
         */
        this.SortBy = null;

        /**
         * Offset for paginated queries. Default value: `0`.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Limit on paginated queries. Default value: `20`. Maximum value: `100`.
         * @type {number || null}
         */
        this.Limit = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubAppId = 'SubAppId' in params ? params.SubAppId : null;

        if (params.Filters) {
            this.Filters = new Array();
            for (let z in params.Filters) {
                let obj = new Filter();
                obj.deserialize(params.Filters[z]);
                this.Filters.push(obj);
            }
        }

        if (params.SortBy) {
            let obj = new SortBy();
            obj.deserialize(params.SortBy)
            this.SortBy = obj;
        }
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;

    }
}

/**
 * Incremental migration back-to-origin HTTP Header information.
 * @class
 */
class IncrementalMigrationHttpHeaderInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * HTTP Header Passthrough Mode. Values valid:
<li>FOLLOW_ALL: Pass through all header information;<\li>
<li>FOLLOW_PART: Pass through partial header information;<\li>
<li>IGNORE_PART: Ignore partial header information.<\li>
         * @type {string || null}
         */
        this.HeaderFollowMode = null;

        /**
         * Header Key Set for Passthrough. This field is required only when the HeaderFollowMode is set to `FOLLOW_PART`.
         * @type {Array.<string> || null}
         */
        this.FollowHttpHeaderKeySet = null;

        /**
         * Add Header Key-Value Pair Collection.
         * @type {Array.<IncrementalMigrationHttpHeader> || null}
         */
        this.NewHttpHeaderSet = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.HeaderFollowMode = 'HeaderFollowMode' in params ? params.HeaderFollowMode : null;
        this.FollowHttpHeaderKeySet = 'FollowHttpHeaderKeySet' in params ? params.FollowHttpHeaderKeySet : null;

        if (params.NewHttpHeaderSet) {
            this.NewHttpHeaderSet = new Array();
            for (let z in params.NewHttpHeaderSet) {
                let obj = new IncrementalMigrationHttpHeader();
                obj.deserialize(params.NewHttpHeaderSet[z]);
                this.NewHttpHeaderSet.push(obj);
            }
        }

    }
}

/**
 * ModifyIncrementalMigrationStrategy request structure.
 * @class
 */
class ModifyIncrementalMigrationStrategyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * <b>The ID of [VOD Professional Application](http://tencentcloud.com/document/product/266/67977).</b>
         * @type {number || null}
         */
        this.SubAppId = null;

        /**
         * The bucket ID where the strategy takes effect.
         * @type {string || null}
         */
        this.BucketId = null;

        /**
         * The ID of the incremental migration strategy.
         * @type {string || null}
         */
        this.StrategyId = null;

        /**
         * The name of the incremental migration strategy.
         * @type {string || null}
         */
        this.StrategyName = null;

        /**
         * Source type. Valid values: 
<li>HTTP: (Default) the source type is HTTP.</li>
         * @type {string || null}
         */
        this.OriginType = null;

        /**
         * Incremental migration HTTP origin source configuration. If left blank, it will default to no modification.
         * @type {IncrementalMigrationHttpOriginConfig || null}
         */
        this.HttpOriginConfig = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubAppId = 'SubAppId' in params ? params.SubAppId : null;
        this.BucketId = 'BucketId' in params ? params.BucketId : null;
        this.StrategyId = 'StrategyId' in params ? params.StrategyId : null;
        this.StrategyName = 'StrategyName' in params ? params.StrategyName : null;
        this.OriginType = 'OriginType' in params ? params.OriginType : null;

        if (params.HttpOriginConfig) {
            let obj = new IncrementalMigrationHttpOriginConfig();
            obj.deserialize(params.HttpOriginConfig)
            this.HttpOriginConfig = obj;
        }

    }
}

/**
 * CreateStorageCredentials response structure.
 * @class
 */
class CreateStorageCredentialsResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Credentials.
         * @type {Credentials || null}
         */
        this.Credentials = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.Credentials) {
            let obj = new Credentials();
            obj.deserialize(params.Credentials)
            this.Credentials = obj;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Incremental migration of origin fixed file path configuration.
 * @class
 */
class IncrementalMigrationOriginFixedFileConfig extends  AbstractModel {
    constructor(){
        super();

        /**
         * Fixed file path: If you fill in `example/test.png`, the origin-pull address will be: `http(s)://<origin domain>/example/test.png`.
         * @type {string || null}
         */
        this.FixedFilePath = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.FixedFilePath = 'FixedFilePath' in params ? params.FixedFilePath : null;

    }
}

/**
 * Key-value pair filters for conditional filtering queries, such as filtering ID, name, and status.
If more than one filter exists, the logical relationship between these filters is `AND`.
If multiple values exist in one filter, the logical relationship between these values under the same filter is `OR`.
 * @class
 */
class Filter extends  AbstractModel {
    constructor(){
        super();

        /**
         * Fields to be filtered.
         * @type {string || null}
         */
        this.Name = null;

        /**
         * Value of the filtered field.
         * @type {Array.<string> || null}
         */
        this.Values = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Name = 'Name' in params ? params.Name : null;
        this.Values = 'Values' in params ? params.Values : null;

    }
}

/**
 * DeleteIncrementalMigrationStrategy response structure.
 * @class
 */
class DeleteIncrementalMigrationStrategyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Incremental migration of origin file information.
 * @class
 */
class IncrementalMigrationOriginFileInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * File prefix configuration.
         * @type {IncrementalMigrationOriginPrefixConfig || null}
         */
        this.PrefixConfig = null;

        /**
         * File 	suffix configuration.
         * @type {IncrementalMigrationOriginSuffixConfig || null}
         */
        this.SuffixConfig = null;

        /**
         * Fixed file configuration.
         * @type {IncrementalMigrationOriginFixedFileConfig || null}
         */
        this.FixedFileConfig = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.PrefixConfig) {
            let obj = new IncrementalMigrationOriginPrefixConfig();
            obj.deserialize(params.PrefixConfig)
            this.PrefixConfig = obj;
        }

        if (params.SuffixConfig) {
            let obj = new IncrementalMigrationOriginSuffixConfig();
            obj.deserialize(params.SuffixConfig)
            this.SuffixConfig = obj;
        }

        if (params.FixedFileConfig) {
            let obj = new IncrementalMigrationOriginFixedFileConfig();
            obj.deserialize(params.FixedFileConfig)
            this.FixedFileConfig = obj;
        }

    }
}

/**
 * Credentials.
 * @class
 */
class Credentials extends  AbstractModel {
    constructor(){
        super();

        /**
         * Access Key ID.
         * @type {string || null}
         */
        this.AccessKeyId = null;

        /**
         * Secret Access Key.
         * @type {string || null}
         */
        this.SecretAccessKey = null;

        /**
         * The session token length depends on the binding policy and is no longer than 4096 bytes.
         * @type {string || null}
         */
        this.SessionToken = null;

        /**
         * The expiration time of the credentials.
         * @type {string || null}
         */
        this.Expiration = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.AccessKeyId = 'AccessKeyId' in params ? params.AccessKeyId : null;
        this.SecretAccessKey = 'SecretAccessKey' in params ? params.SecretAccessKey : null;
        this.SessionToken = 'SessionToken' in params ? params.SessionToken : null;
        this.Expiration = 'Expiration' in params ? params.Expiration : null;

    }
}

/**
 * CreateStorage request structure.
 * @class
 */
class CreateStorageRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * <b>The ID of [VOD Professional Application](http://tencentcloud.com/document/product/266/67977).</b>
         * @type {number || null}
         */
        this.SubAppId = null;

        /**
         * Storage region, which must be a region supported by the system. All storage regions and the regions where storage buckets have already been enabled can be queried using the [DescribeStorageRegions](https://www.tencentcloud.com/document/product/266/46542) API.
         * @type {string || null}
         */
        this.StorageRegion = null;

        /**
         * The name of the storage.
<li>Only lowercase English letters, numbers, hyphens "-", and their combinations are supported.</li>
<li>The storage name cannot start or end with a "-".</li>
<li>The maximum length of the storage name is 64 characters.</li>
         * @type {string || null}
         */
        this.StorageName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubAppId = 'SubAppId' in params ? params.SubAppId : null;
        this.StorageRegion = 'StorageRegion' in params ? params.StorageRegion : null;
        this.StorageName = 'StorageName' in params ? params.StorageName : null;

    }
}

/**
 * DescribeStorage response structure.
 * @class
 */
class DescribeStorageResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Total count of matched storage.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Information of all matched storage.
         * @type {Array.<StorageInfo> || null}
         */
        this.StorageInfoSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.StorageInfoSet) {
            this.StorageInfoSet = new Array();
            for (let z in params.StorageInfoSet) {
                let obj = new StorageInfo();
                obj.deserialize(params.StorageInfoSet[z]);
                this.StorageInfoSet.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyIncrementalMigrationStrategy response structure.
 * @class
 */
class ModifyIncrementalMigrationStrategyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Incremental migration back-to-source conditions.
 * @class
 */
class IncrementalMigrationHttpOriginCondition extends  AbstractModel {
    constructor(){
        super();

        /**
         * HTTP code to trigger back-to-source conditions. If not filled, the default value is `404`.
         * @type {number || null}
         */
        this.HttpStatusCode = null;

        /**
         * Object key prefix to trigger back-to-source conditions
         * @type {string || null}
         */
        this.Prefix = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.HttpStatusCode = 'HttpStatusCode' in params ? params.HttpStatusCode : null;
        this.Prefix = 'Prefix' in params ? params.Prefix : null;

    }
}

/**
 * CreateStorage response structure.
 * @class
 */
class CreateStorageResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique identifier ID of the storage bucket.
         * @type {string || null}
         */
        this.BucketId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.BucketId = 'BucketId' in params ? params.BucketId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Incremental migration back-to-source parameters.
 * @class
 */
class IncrementalMigrationHttpOriginParameter extends  AbstractModel {
    constructor(){
        super();

        /**
         * HTTP header passthrough information.
         * @type {IncrementalMigrationHttpHeaderInfo || null}
         */
        this.HttpHeaderInfo = null;

        /**
         * Back-to-source protocol. Valid values:
<li>HTTP: Force HTTP;</li>
<li>HTTPS: Force HTTPS;</li>
<li>FOLLOW: Follow the request protocol.</li>
         * @type {string || null}
         */
        this.Protocol = null;

        /**
         * Query string passthrough mode. Valid values
<li>FOLLOW: Fully passthrough;</li>
<li>IGNORE: No passthrough at all.</li>
         * @type {string || null}
         */
        this.QueryStringFollowMode = null;

        /**
         * HTTP Code for redirection. Currently, only `301`, `302`, and `307` are supported. The default value is `302`.
         * @type {number || null}
         */
        this.HttpRedirectCode = null;

        /**
         * Origin server redirection follow mode. Valid values:
<li>FOLLOW: Follow origin server redirection;</li>
<li>IGNORE: Ignore origin server redirection.</li>
         * @type {string || null}
         */
        this.OriginRedirectionFollowMode = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.HttpHeaderInfo) {
            let obj = new IncrementalMigrationHttpHeaderInfo();
            obj.deserialize(params.HttpHeaderInfo)
            this.HttpHeaderInfo = obj;
        }
        this.Protocol = 'Protocol' in params ? params.Protocol : null;
        this.QueryStringFollowMode = 'QueryStringFollowMode' in params ? params.QueryStringFollowMode : null;
        this.HttpRedirectCode = 'HttpRedirectCode' in params ? params.HttpRedirectCode : null;
        this.OriginRedirectionFollowMode = 'OriginRedirectionFollowMode' in params ? params.OriginRedirectionFollowMode : null;

    }
}

/**
 * Incremental migration of origin file suffix configuration.
 * @class
 */
class IncrementalMigrationOriginSuffixConfig extends  AbstractModel {
    constructor(){
        super();

        /**
         * File suffix.
if filled with `.ts`, the origin-pull address will be: `http(s)://<origin domain>/<file name>.ts`.
         * @type {string || null}
         */
        this.Suffix = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Suffix = 'Suffix' in params ? params.Suffix : null;

    }
}

/**
 * Configuration of the origin for incremental migration back-to-source.
 * @class
 */
class IncrementalMigrationHttpOriginConfig extends  AbstractModel {
    constructor(){
        super();

        /**
         * Origin information for back-to-source.
         * @type {IncrementalMigrationHttpOriginInfo || null}
         */
        this.OriginInfo = null;

        /**
         * Back-to-source parameters.
         * @type {IncrementalMigrationHttpOriginParameter || null}
         */
        this.OriginParameter = null;

        /**
         * Back-to-source mode. Valid values:
<li>SYNC: Synchronous back-to-source;</li>
<li>ASYNC: Asynchronous back-to-source.</li>
         * @type {string || null}
         */
        this.Mode = null;

        /**
         * Back-to-source conditions.
         * @type {IncrementalMigrationHttpOriginCondition || null}
         */
        this.OriginCondition = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.OriginInfo) {
            let obj = new IncrementalMigrationHttpOriginInfo();
            obj.deserialize(params.OriginInfo)
            this.OriginInfo = obj;
        }

        if (params.OriginParameter) {
            let obj = new IncrementalMigrationHttpOriginParameter();
            obj.deserialize(params.OriginParameter)
            this.OriginParameter = obj;
        }
        this.Mode = 'Mode' in params ? params.Mode : null;

        if (params.OriginCondition) {
            let obj = new IncrementalMigrationHttpOriginCondition();
            obj.deserialize(params.OriginCondition)
            this.OriginCondition = obj;
        }

    }
}

/**
 * Sort by criterion
 * @class
 */
class SortBy extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sort by field
         * @type {string || null}
         */
        this.Field = null;

        /**
         * Sorting order. Valid values: Asc (ascending), Desc (descending)
         * @type {string || null}
         */
        this.Order = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Field = 'Field' in params ? params.Field : null;
        this.Order = 'Order' in params ? params.Order : null;

    }
}

/**
 * CreateIncrementalMigrationStrategy request structure.
 * @class
 */
class CreateIncrementalMigrationStrategyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * <b>The ID of [VOD Professional Application](http://tencentcloud.com/document/product/266/67977).</b>
         * @type {number || null}
         */
        this.SubAppId = null;

        /**
         * The bucket ID where the strategy takes effect.
         * @type {string || null}
         */
        this.BucketId = null;

        /**
         * Incremental migration strategy name. The name length should not exceed 100 characters. Allowed characters include: Chinese characters, English characters, `0-9`,` _` and ` -`.
         * @type {string || null}
         */
        this.StrategyName = null;

        /**
         * Source type. Valid values: 
<li>HTTP: the source type is HTTP.</li>
         * @type {string || null}
         */
        this.OriginType = null;

        /**
         * Incremental migration HTTP origin source configuration. This field is required when the OriginType value is `HTTP`.
         * @type {IncrementalMigrationHttpOriginConfig || null}
         */
        this.HttpOriginConfig = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubAppId = 'SubAppId' in params ? params.SubAppId : null;
        this.BucketId = 'BucketId' in params ? params.BucketId : null;
        this.StrategyName = 'StrategyName' in params ? params.StrategyName : null;
        this.OriginType = 'OriginType' in params ? params.OriginType : null;

        if (params.HttpOriginConfig) {
            let obj = new IncrementalMigrationHttpOriginConfig();
            obj.deserialize(params.HttpOriginConfig)
            this.HttpOriginConfig = obj;
        }

    }
}

module.exports = {
    CreateIncrementalMigrationStrategyResponse: CreateIncrementalMigrationStrategyResponse,
    IncrementalMigrationStrategyInfo: IncrementalMigrationStrategyInfo,
    DeleteIncrementalMigrationStrategyRequest: DeleteIncrementalMigrationStrategyRequest,
    IncrementalMigrationHttpOriginInfo: IncrementalMigrationHttpOriginInfo,
    CreateStorageCredentialsRequest: CreateStorageCredentialsRequest,
    IncrementalMigrationHttpEndpointInfo: IncrementalMigrationHttpEndpointInfo,
    IncrementalMigrationOriginPrefixConfig: IncrementalMigrationOriginPrefixConfig,
    DescribeIncrementalMigrationStrategyInfosResponse: DescribeIncrementalMigrationStrategyInfosResponse,
    IncrementalMigrationHttpHeader: IncrementalMigrationHttpHeader,
    StorageInfo: StorageInfo,
    DescribeStorageRequest: DescribeStorageRequest,
    DescribeIncrementalMigrationStrategyInfosRequest: DescribeIncrementalMigrationStrategyInfosRequest,
    IncrementalMigrationHttpHeaderInfo: IncrementalMigrationHttpHeaderInfo,
    ModifyIncrementalMigrationStrategyRequest: ModifyIncrementalMigrationStrategyRequest,
    CreateStorageCredentialsResponse: CreateStorageCredentialsResponse,
    IncrementalMigrationOriginFixedFileConfig: IncrementalMigrationOriginFixedFileConfig,
    Filter: Filter,
    DeleteIncrementalMigrationStrategyResponse: DeleteIncrementalMigrationStrategyResponse,
    IncrementalMigrationOriginFileInfo: IncrementalMigrationOriginFileInfo,
    Credentials: Credentials,
    CreateStorageRequest: CreateStorageRequest,
    DescribeStorageResponse: DescribeStorageResponse,
    ModifyIncrementalMigrationStrategyResponse: ModifyIncrementalMigrationStrategyResponse,
    IncrementalMigrationHttpOriginCondition: IncrementalMigrationHttpOriginCondition,
    CreateStorageResponse: CreateStorageResponse,
    IncrementalMigrationHttpOriginParameter: IncrementalMigrationHttpOriginParameter,
    IncrementalMigrationOriginSuffixConfig: IncrementalMigrationOriginSuffixConfig,
    IncrementalMigrationHttpOriginConfig: IncrementalMigrationHttpOriginConfig,
    SortBy: SortBy,
    CreateIncrementalMigrationStrategyRequest: CreateIncrementalMigrationStrategyRequest,

}
